// 将示例代码封装在一个函数中
pub fn run_examples() {
  println!("===== Rust 浮点数示例 =====\n");

  // 1. 浮点类型定义及基础使用
  println!("1. 浮点类型定义及基础使用:");
  example_1();

  // 2. 浮点数相加精度问题, 经典 0.1 + 0.2 !== 0.3
  println!("2. 浮点数相加精度问题, 经典 0.1 + 0.2 !== 0.3:");
  example_2();
}

// 1. 浮点类型定义及基础使用
fn example_1() {
  let x = 1_000.000_1; // 1000.0001
  let y: f32 = 0.12; // f32
  let z = 0.01_f64; // f64
  println!("    定义 let x = 1_000.000_1; equal to {}", x);
  println!("    定义 let y: f32 = 0.12; equal to {}", y);
  println!("    定义 let z = 0.01_f64; equal to {}", z);
}

// 2. 浮点数相加精度问题, 经典 0.1 + 0.2 !== 0.3
fn example_2() {
  let x: f64 = 0.1 + 0.2;
  let y: f64 = 0.3;
  println!("    0.1+0.2={}", 0.1 + 0.2);
  println!("    (0.1+0.2).to_bits()={}", x.to_bits());
  println!("    (0.3).to_bits()={}", y.to_bits());
  println!("    2.1 容差比较, ((0.1+0.2).abs()-0.3) < std::f64::EPSILON is {}", (x - y).abs() < std::f64::EPSILON);
  // 先用 format! 格式化字符串输入保留一位小数, 再 parse::<f64> 转为 f64 类型.
  let z = format!("{:.1}", x).parse::<f64>().unwrap();
  println!("    2.2 四舍五入到一位小数 = {}", z);
  // println!("    0.1+0.2={}", i.to_degrees());
}

